'use strict';
var vk; // 全局vk实例
// 涉及的表名
const dbName = {
	//test: "vk-test", // 测试表
};
const crypto = require('crypto');

// 快递100接口
// config申请渠道：https://api.kuaidi100.com/manager/v2/query/overview

// 快递100配置
const config = {
	key: "", // 授权key
	customer: "", // 查快递需要
	secret: "", // 电子面单 - secret
	partnerId: "", // 电子面单 - 电子面单客户账户或月结账号，需贵司向当地快递公司网点申请 申请指南：https://api.kuaidi100.com/document/zhanghaoshenqingzhinan.html
	partnerKey: "", // 电子面单 - 电子面单密码，需贵司向当地快递公司网点申请
	tempid: "", // 电子面单 - 通过管理后台的打印模版配置信息获取
	siid: "", // 快递100打印机或者云盒设备码
};

const apiUrl = "https://poll.kuaidi100.com/";


var db = uniCloud.database(); // 全局数据库引用
var _ = db.command; // 数据库操作符
var $ = _.aggregate; // 聚合查询操作符
/**
 * 权限注意：
 * pub_ 开头的函数不需要登录即可访问 如：pub_getList
 * kh_ 开头的函数需要登录才能访问 如：kh_getList
 * sys_ 开头的函数需要授权指定权限才能访问 如：sys_getList
 * _ 开头的函数禁止前端访问 如：_before
 * 其他函数 默认均需要登录才能访问 如：getList（若将云对象文件放在pub目录下，则默认其他函数不需要登录即可访问，若放在sys目录下，则默认其他函数需要授权才能访问）
 */
var cloudObject = {
	isCloudObject: true, // 标记为云对象模式
	/**
	 * 请求前处理，主要用于调用方法之前进行预处理，一般用于拦截器、统一的身份验证、参数校验、定义全局对象等。
	 */
	_before: async function() {
		vk = this.vk; // 将vk定义为全局对象
		// let { customUtil, uniID, config, pubFun } = this.getUtil(); // 获取工具包
	},
	/**
	 * 请求后处理，主要用于处理本次调用方法的返回结果或者抛出的错误
	 */
	_after: async function(obj) {
		let { err, res } = obj;
		if (err) {
			return; // 如果方法抛出错误，直接return;不处理
		}
		return res
	},
	/**
	 * 根据快递单号查询快递信息
	 * @url plugs/kuaidi100.getInfo 前端调用的url参数地址
	 */
	getInfo: async function(data) {
		let { uid } = this.getClientInfo(); // 获取客户端信息
		let res = { code: 0, msg: 'ok' };
		// 业务逻辑开始-----------------------------------------------------------
		let {
			com = "auto",
				no,
				phone
		} = data;
		let param = JSON.stringify({
			com,
			num: no,
			phone
		});
		// 签名
		let sign = this._sign(param + config.key + config.customer);
		// 请求参数
		let requestData = {
			param,
			customer: config.customer,
			sign
		};
		// 缓存键名
		let keyName = `pub-kuaidi100-${com}-${no}-${phone}`;
		// 读取缓存
		let requestRes = await vk.globalDataCache.get(keyName, 3600 * 6, async () => {
			// 若无缓存时的请求
			return await this._request({
				url: `poll/query.do`,
				method: "POST",
				data: requestData
			});
		});
		if (requestRes.code !== 0) {
			return requestRes;
		}
		res.data = requestRes;
		// 业务逻辑结束-----------------------------------------------------------
		return res;
	},
	/**
	 * 根据单号查询快递公司
	 * @url plugs/kuaidi100.getExpressCom 前端调用的url参数地址
	 */
	getExpressCom: async function(data) {
		let res = { code: 0, msg: '' };
		// 业务逻辑开始-----------------------------------------------------------
		let {
			no,
		} = data;
		// 请求参数
		let requestData = {
			num: no,
			key: config.key
		};

		let requestRes = await this._request({
			url: `autonumber/auto`,
			method: "GET",
			data: requestData
		});
		if (requestRes.code !== 0) {
			return requestRes;
		}
		res.data = requestRes;

		// 业务逻辑结束-----------------------------------------------------------
		return res;
	},
	// 打印电子面单
	printtask: async function(data) {
		let { uid } = this.getClientInfo(); // 获取客户端信息
		let res = { code: 0, msg: 'ok' };
		// 业务逻辑开始-----------------------------------------------------------
		let {
			com = "auto",
				count = 1,
				recMan, // 收货人信息
				sendMan, // 寄件人信息
		} = data;

		let param = JSON.stringify({
			type: 10,
			partnerId: config.partnerId,
			partnerKey: config.partnerKey,
			kuaidicom: com,
			recMan: { //收件人信息
				name: recMan.name,
				mobile: recMan.mobile,
				printAddr: recMan.printAddr
			},
			sendMan: { //寄件人信息
				name: sendMan.name,
				mobile: sendMan.mobile,
				printAddr: sendMan.printAddr
			},
			count: count,
			tempid: config.tempid, //通过管理后台的打印模版配置信息获取
			siid: config.siid //快递100打印机或者云盒设备码
		});
		let t = Date.now();

		let sign = this._sign(param + t + config.key + config.secret);

		// 请求参数
		let requestData = {
			method: "eOrder",
			key: config.key,
			t,
			param,
			sign
		};

		let requestRes = await this._request({
			url: `printapi/printtask.do`,
			method: "POST",
			data: requestData
		});

		if (requestRes.code !== 0) {
			return requestRes;
		}
		res.data = requestRes;
		// 业务逻辑结束-----------------------------------------------------------
		return res;
	},
	/**
	 * 发起请求
	let requestRes = await this._request({
		url: `poll/query.do`,
		method: "POST",
		data: requestData
	});
		*/
	_request: async function(obj) {
		let {
			url,
			method,
			headers = {
				"Content-Type": "application/x-www-form-urlencoded"
			},
			data
		} = obj;
		let requestRes = await vk.request({
			url: `${apiUrl}${url}`,
			method,
			headers,
			data
		});
		requestRes.code = requestRes.status === "200" ? 0 : -1;
		requestRes.msg = requestRes.message;
		return requestRes;
	},
	// 签名
	_sign: function(signStr) {
		const md5 = crypto.createHash('md5');
		let sign = md5.update(signStr).digest('hex').toUpperCase();
		return sign;
	}
};

module.exports = cloudObject;
